#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    int fd[2]; // 文件描述符数组: fd[0] 用于读, fd[1] 用于写
    pid_t pid;
    char buffer[100];                  // 用于读取数据的缓冲区
    char message[] = "20242815王力丰"; // 要发送的数据 (你的学号+姓名)

    // 1. 创建管道
    if (pipe(fd) == -1)
    {
        perror("pipe failed");
        exit(EXIT_FAILURE);
    }

    // 2. 创建子进程
    pid = fork();

    if (pid < 0)
    { // fork 失败
        perror("fork failed");
        close(fd[0]); // 关闭管道两端
        close(fd[1]);
        exit(EXIT_FAILURE);
    }
    else if (pid > 0)
    { // 父进程
        printf("父进程 (PID: %d): 准备向管道写入数据...\n", getpid());

        // 关闭未使用的读取端
        close(fd[0]);

        // 3. 向管道写入数据
        ssize_t bytes_written = write(fd[1], message, strlen(message));
        if (bytes_written == -1)
        {
            perror("Parent write failed");
            close(fd[1]);
            exit(EXIT_FAILURE);
        }
        printf("父进程: 成功写入 %ld 字节: \"%s\"\n", bytes_written, message);

        // 关闭写入端 (发送 EOF 信号给读取端)
        close(fd[1]);

        // 等待子进程结束 (可选，但推荐)
        wait(NULL);
        printf("父进程: 子进程已结束，父进程退出。\n");
    }
    else
    { // 子进程 (pid == 0)
        printf("子进程 (PID: %d): 准备从管道读取数据...\n", getpid());

        // 关闭未使用的写入端
        close(fd[1]);

        // 4. 从管道读取数据
        ssize_t bytes_read = read(fd[0], buffer, sizeof(buffer) - 1); // 留一位给 '\0'
        if (bytes_read == -1)
        {
            perror("Child read failed");
            close(fd[0]);
            exit(EXIT_FAILURE);
        }
        else if (bytes_read == 0)
        {
            printf("子进程: 读取到 0 字节 (管道已关闭?).\n");
        }
        else
        {
            // 添加字符串结束符
            buffer[bytes_read] = '\0';
            printf("子进程: 成功读取 %ld 字节，接收到数据: \"%s\"\n", bytes_read, buffer);
        }

        // 关闭读取端
        close(fd[0]);
        printf("子进程: 读取完毕，退出。\n");
        exit(EXIT_SUCCESS); // 子进程正常退出
    }

    return 0; // 父进程正常退出
}